package com.itheima.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * <dl>
 * <dd>描述: ~节点业务逻辑实现</dd>
 * <dd>创建时间：  10:19 2020/7/27</dd>
 * <dd>创建人： zz</dd>
 * <dt>版本历史: </dt>
 * <pre>
 * Date         Author      Version     Description
 * ------------------------------------------------------------------
 * 2020/7/27      guodong       1.0        1.0 Version
 * </pre>
 * </dl>
 */
@Component
@Slf4j
public class RabbitMqConfirmAndReturn implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostConstruct //@PostConstruct会在@Autowired后执行
    public void init(){
        /*
            :: 代表方法的引用
         */
        /*rabbitTemplate.setConfirmCallback(this::confirm);
        rabbitTemplate.setReturnCallback(this::returnedMessage);*/
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }



    /*
        confirm确认模式：确认消息是否到达交换机
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if(ack){ //ack=true 表示消息到达交换机
           log.info("消息到达交换机, ack : {}", ack);
        }else {
            log.info("消息进入交换机失败, ack : {}", ack);
        }
    }

    /*
     return 回退模式：确认消息是否到达队列，只有在消息没有从交换机路由至队列时此方法回调

    */

    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.error("消息从交换机路由至队列失败：replyCode： {}， replyText：{}， exchange：{}， routingKey：{}",
                replyCode, replyText, exchange, routingKey);
    }

}
